package com.jgsu.farm.utils;

import com.jgsu.farm.enums.suffixname.FileSuffixName;
import com.jgsu.farm.enums.suffixname.ImageSuffixName;
import com.jgsu.farm.enums.suffixname.VideoSuffixName;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * @program: farm-system
 * @description: 文件上传类, 文件上传类型在enums文件夹中
 * @author: Mr.zuo
 * @create: 2019-12-10 16:28
 **/
@Slf4j
@Component
public class FileUploadUtil {
    public String upload(MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            return null;
        } else {
            // 获取原始文件名
            String OriginalFilename = file.getOriginalFilename();
            // 获取文件的原始名称不包含.xxx
            String name = OriginalFilename.substring(0, OriginalFilename.lastIndexOf("."));
            // 获取文件后缀名
            String suffixName = OriginalFilename.substring(OriginalFilename.lastIndexOf("."));
            // 设置文件新名称为UUID-时间-文件名
            String fileName = UUID.randomUUID().toString().replace("-", "") + "-" + SystemUtil.getTime() + "-" + name + suffixName;
            String path = "";
            if (FileSuffixName.TXT.getName().equals(suffixName) ||
                    FileSuffixName.DOCX.getName().equals(suffixName) ||
                    FileSuffixName.DOC.getName().equals(suffixName)) {
                path = System.getProperty("user.dir") + "/upload/fileUpload";
            } else if (ImageSuffixName.JPG.getName().equals(suffixName) ||
                    ImageSuffixName.PNG.getName().equals(suffixName) ||
                    ImageSuffixName.GIF.getName().equals(suffixName)) {
                path = System.getProperty("user.dir") + "/upload/imageUpload";
            } else if (VideoSuffixName.AVI.getName().equals(suffixName) ||
                    VideoSuffixName.RMVB.getName().equals(suffixName) ||
                    VideoSuffixName.WMV.getName().equals(suffixName) ||
                    VideoSuffixName.MP4.getName().equals(suffixName)) {
                path = System.getProperty("user.dir") + "/upload/videoUpload";
            } else {
                path = System.getProperty("user.dir") + "/upload/otherFilesUpload";
            }
            File filePath = new File(path);
            log.info("文件上传路径为{}", path);
            if (!filePath.exists() && !filePath.isDirectory()) {
                log.info("该文件夹不存在,创建文件夹{}", filePath);
                filePath.mkdirs();
            }
            // 在指定路径下创建一个文件
            File targetFile = new File(path, fileName);
            // 限制文件上传类型
            if (FileSuffixName.TXT.getName().equals(suffixName) ||
                    FileSuffixName.DOCX.getName().equals(suffixName) ||
                    FileSuffixName.DOC.getName().equals(suffixName)) {
                log.info("上传普通文件，类型为{}", suffixName);
                try {
                    file.transferTo(targetFile);
                    log.info("文件{}上传成功", fileName);
                    return fileName;
                } catch (IOException e) {
                    log.error("文件{}上传失败", fileName);
                    throw new IOException(e.getMessage());
                }
            } else if (ImageSuffixName.JPG.getName().equals(suffixName) ||
                    ImageSuffixName.PNG.getName().equals(suffixName) ||
                    ImageSuffixName.JPG.getName().equals(suffixName)) {
                log.info("上传图片文件，类型为{}", suffixName);
                try {
                    file.transferTo(targetFile);
                    log.info("图片{}上传成功", fileName);
                    return fileName;
                } catch (IOException e) {
                    log.error("图片{}上传失败", fileName);
                    throw new IOException(e.getMessage());
                }
            } else if (VideoSuffixName.AVI.getName().equals(suffixName) ||
                    VideoSuffixName.RMVB.getName().equals(suffixName) ||
                    VideoSuffixName.WMV.getName().equals(suffixName) ||
                    VideoSuffixName.MP4.getName().equals(suffixName)) {
                log.info("上传视频文件，类型为{}", suffixName);
                try {
                    file.transferTo(targetFile);
                    log.info("视频{}上传成功", fileName);
                    return fileName;
                } catch (IOException e) {
                    log.error("视频{}上传失败", fileName);
                    throw new IOException(e.getMessage());
                }
            } else {
                log.info("上传其他文件，类型为{}", suffixName);
                try {
                    file.transferTo(targetFile);
                    log.info("其他文件{}上传成功", fileName);
                    return fileName;
                } catch (IOException e) {
                    log.error("其他文件{}上传失败", fileName);
                    throw new IOException(e.getMessage());
                }
            }
        }
    }
}
